package com.dcstudy.redis.controller.jhs;

/**
 * @author lichenyang
 * @create 2021-05-25 11:05 上午
 */

import com.dcstudy.redis.entities.jhs.Constants;
import com.dcstudy.redis.entities.jhs.Product;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.util.CollectionUtils;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RestController;

import java.util.List;

/**
 * 实现功能:
 * 淘宝聚划算功能, 在高并发查询的情况下, 将redis中的某个key中的内容 从集合A, 替换成集合B
 * 当前版本为有问题的版本, 带有AB 内容的版本为正确版本
 */
@RestController
@Slf4j
@Api("聚划算商品列表接口")
public class JHSProductController {
    @Autowired
    private RedisTemplate redisTemplate;

    /**
     * 分页查询：在高并发的情况下，只能走 redis 查询，走 db 的话必定会把 db 打垮 * http://localhost:5555/swagger-ui.html#/jhs-product-controller/findUsingGET
     */
    @RequestMapping(value = "/pruduct/find", method = RequestMethod.GET)
    @ApiOperation(" 按照分页和每页显示容量，点击查看 ")
    public List<Product> find(int page, int size) {
        List<Product> list = null;
        long start = (page - 1) * size;
        long end = start + size - 1;
        try {
            // 采用 redis list 数据结构的 lrange 命令实现分页查询
            list = this.redisTemplate.opsForList().range(Constants.JHS_KEY, start, end);
            if (CollectionUtils.isEmpty(list)) {
                // TODO 走 DB 查询
            }
            log.info(" 查询结果： {}", list);
        } catch (Exception ex) {
            //这里的异常，一般是 redis 瘫痪 ，或 redis 网络 timeout
            log.error("exception:", ex);
            // TODO 走 DB 查询
        }
        return list;
    }
}